package com.atguigu.multiReading;
public class threadPractice {
    public static void main(String[] args) {
        Print print = new Print();
        MyThread myThread = new MyThread(print);
        Thread thread1 = new Thread(myThread,"A");
        Thread thread2 = new Thread(myThread,"B");
        Thread thread3 = new Thread(myThread,"C");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

class Print{
    private int flag = 1;
    private int count = 0;

    public int getCount() {
        return count;
    }

    public synchronized void printA(){
        while (flag != 1){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 2;
        count++;
        notifyAll();
    }
    public synchronized void printB(){
        while (flag != 2){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 3;
        count++;
        notifyAll();
    }
    public synchronized void printC(){
        while (flag != 3){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 1;
        count++;
        notifyAll();
    }
}

class MyThread implements Runnable {
    private Print print;

    public MyThread(Print print) {
        this.print = print;
    }
    @Override
    public void run() {
        while (print.getCount() < 28) {
            if (Thread.currentThread().getName().equals("A")) {
                print.printA();
            } else if (Thread.currentThread().getName().equals("B")) {
                print.printB();
            } else if (Thread.currentThread().getName().equals("C")) {
                print.printC();
            }
        }
    }
}
class Base{
    //2.先声明当前类对象,没有初始化，声明为static
    private static Base instance=null;
    //1.私有化类的构造器
    private Base(){
    }

    //3. 声明public的静态的返回当前类对象的方法
    public static Base getInstance(){
        if(instance==null){
            instance= new Base();
        }
        return instance;
    }
}